home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / examples / avail2 / avail2.s < prev   
Text File  |  1996-04-25  |  8KB  |  371 lines

  1. ;-------------------------------------------------------------------------------
  2. *                                                                              *
  3. * Avail2                                                                       *
  4. *                                                                              *
  5. * Written 1992 by Daniel Weber                                                 *
  6. *                                                                              *
  7. *                                                                              *
  8. *       Filename        avail2.s                                               *
  9. *       Author          Daniel Weber                                           *
  10. *       Version         1.04                                                   *
  11. *       Start           1992                                                   *
  12. *                                                                              *
  13. *       Last Revision   16.09.93                                               *
  14. *                                                                              *
  15. ;-------------------------------------------------------------------------------
  16.  
  17.     output    'ram:avail2'
  18.  
  19. ;    opt    o+,q+,ow-,qw-
  20.     super
  21.     verbose
  22.     base    progbase
  23.  
  24. ;    multipass
  25.  
  26.     filenote    'Avail2, written 1992 by Daniel Weber'
  27.  
  28. ;-------------------------------------------------------------------------------
  29.  
  30.     incdir    'include:'
  31.  
  32.     include    exec/execbase.i
  33.     include    exec/memory.i
  34.     incequ    'LVO.s'
  35.  
  36. ;-------------------------------------------------------------------------------
  37.  
  38. version        equr    "1.04"
  39.  
  40.  
  41. ;-- user definitions --
  42. AbsExecBase    equ    4
  43.  
  44.  
  45. ;MemList        equ    322
  46. ;MEMF_CHIP        equ    2
  47. ;MEMF_FAST        equ    4
  48. ;MEMF_LARGEST        equ    $20000
  49. ;
  50. ;MH_ATTRIBUTES        equ    14
  51. ;MH_FIRST        equ    16
  52. ;MH_LOWER        equ    20
  53. ;MH_UPPER        equ    24
  54. ;MH_FREE        equ    28
  55. ;MH_SIZE        equ    32
  56. ;
  57. ;_LVOOldOpenLibrary    equ    -408
  58. ;_LVOCloseLibrary    equ    -414
  59. ;_LVOForbid        equ    -132
  60. ;_LVOPermit        equ    -138
  61. ;_LVOAvailMem        equ    -216
  62. ;_LVORawDoFmt        equ    -522
  63. ;_LVOWrite        equ    -48
  64. ;_LVOOutput        equ    -60
  65.  
  66.  
  67. ;-------------------------------------------------------------------------------
  68. progbase:
  69.     bra.s    start
  70.     dc.b    0,"$VER: Avail2 ",version," (",__date2,")",0
  71.     even
  72.  
  73. ;----------------------------
  74. start:    movem.l    d0-a6,-(a7)
  75.     lea    progbase(pc),a5
  76.     move.l    a0,cmdline(a5)
  77.     move.l    d0,cmdsize(a5)
  78.     lea    DosName(pc),a1
  79.     move.l    (AbsExecBase).w,a6
  80.     jsr    _LVOOldOpenLibrary(a6)
  81.     move.l    d0,DosBase(a5)
  82.     beq.s    .nodos
  83.  
  84.     move.l    d0,a6
  85.     jsr    _LVOOutput(a6)
  86.     move.l    d0,outputhd(a5)
  87.  
  88.     bsr    getcommandline
  89.     bne.s    .exit
  90.     bsr.s    avail
  91.  
  92.  
  93. .exit:    move.l    DosBase(pc),a1
  94.     move.l    (AbsExecBase).w,a6
  95.     jsr    _LVOCloseLibrary(a6)
  96.  
  97. .nodos:    movem.l    (a7)+,d0-a6
  98.     moveq    #0,d0
  99.     rts
  100.  
  101.  
  102.  
  103. ;----------------------------------------------------------
  104. ;
  105. ; evaluate available/used memory
  106. ;
  107. avail:    lea    menline(pc),a0
  108.     bsr    write
  109.  
  110.     move.b    flag(pc),d0
  111.     bmi.s    .fast
  112.     beq.s    .chip
  113.     subq.w    #2,d0
  114.     bne.s    .chip
  115.  
  116.     move.l    #$7fffffff,d0
  117.     moveq    #0,d1
  118.     move.l    (AbsExecBase).w,a6
  119.     jsr    _LVOAllocMem(a6)
  120.     clr.b    flag(a5)
  121.  
  122. .chip:    move.l    (AbsExecBase).w,a6        ;chip memory
  123.     jsr    _LVOForbid(a6)
  124.     move.l    MemList(a6),a5
  125.     moveq    #MEMF_CHIP,d1
  126.     bsr    takerawlist
  127.     move.l    #memchip,(a1)+
  128.     bsr    calcmem
  129.  
  130.     jsr    _LVOPermit(a6)
  131.     bsr    doraw
  132.     move.b    flag(pc),d0
  133.     bne.s    notot
  134.     jsr    _LVOForbid(a6)
  135.  
  136.  
  137. .fast:    lea    memarray(pc),a1            ;fast memory
  138.     lea    workspace(pc),a0
  139.     move.l    (a1),(a0)+
  140.     move.l    4(a1),(a0)+
  141.     move.l    8(a1),(a0)+
  142.     move.l    12(a1),(a0)+
  143.     bsr    takerawlist
  144.     move.l    #memfast,(a1)+
  145.     moveq    #MEMF_FAST,d1
  146.     move.l    (AbsExecBase).w,a6
  147.     move.l    MemList(a6),a5
  148.     bsr    calcmem
  149.  
  150.     jsr    _LVOPermit(a6)
  151.     bsr    doraw
  152.     move.b    flag(pc),d0
  153.     bne.s    notot
  154.  
  155.     lea    memarray(pc),a1
  156.     lea    workspace(pc),a0
  157.     moveq    #4-1,d7
  158.  
  159. calcloop:                ;evaluate total sums
  160.     move.l    (a0)+,d0
  161.     add.l    d0,(a1)+
  162.     dbra    d7,calcloop
  163.     lea    rawlist(pc),a1
  164.     move.l    #memtot,(a1)
  165.     bsr.s    doraw
  166. notot:    rts
  167.  
  168.  
  169.  
  170. ;------------------
  171. ;
  172. ;a1: rawlist
  173. ;a5: memlist (memory region header)
  174. ;
  175. calcmem2:
  176.     move.w    MH_ATTRIBUTES(a5),d0
  177.     and.w    d1,d0
  178.     beq.s    nextblock
  179.     move.l    MH_UPPER(a5),d3
  180.     sub.l    MH_LOWER(a5),d3
  181.     add.l    d3,12(a1)        ;set in maximum
  182.     add.l    d3,4(a1)        ;set in maximum (later: -available)
  183.     move.l    d1,d2
  184.     bsr.s    availmem
  185.     move.l    d0,(a1)            ;set in availabel
  186.     move.l    d1,d2
  187.     ori.l    #MEMF_LARGEST,d1
  188.     bsr.s    availmem
  189.     move.l    d2,d1
  190.     move.l    d0,8(a1)        ;set in largest
  191.     clr.l    16(a1)            ;set end of doraw mark
  192.  
  193. nextblock:
  194.     move.l    (a5),a5            ;get next (LN_SUCC (exec/nodes.i))
  195.  
  196. calcmem:
  197.     tst.l    (a5)
  198.     bne.s    calcmem2
  199.     move.l    (a1),d0
  200.     sub.l    d0,4(a1)        ;set: in-use
  201.     rts
  202.  
  203.  
  204. ;------------------
  205. availmem:                ;AvailMem()
  206.     movem.l    d1-d2/a1,-(a7)
  207.     move.l    (AbsExecBase).w,a6
  208.     jsr    _LVOAvailMem(a6)
  209.     movem.l    (a7)+,d1-d2/a1
  210.     rts
  211.  
  212.  
  213. ;------------------
  214. takerawlist:                ;prepare raw list for doraw command
  215.     lea    rawlist(pc),a1
  216.     clr.l    (a1)
  217.     clr.l    4(a1)
  218.     clr.l    8(a1)
  219.     clr.l    12(a1)
  220.     clr.l    16(a1)
  221.     clr.l    20(a1)
  222.     rts
  223.  
  224.  
  225.  
  226. ;----------------------------
  227. ;
  228. ; doraw - print a raw formated text
  229. ;
  230. ;
  231. doraw:    move.l    typ(pc),a0
  232.     lea    rawlist(pc),a1
  233. doraw2:    lea    workmem(pc),a3            ;a0: format string, a1: rawlist
  234. doraw3:    move.l    a3,-(a7)            ;a3: destination buffer
  235.     lea    .setin(pc),a2
  236.     move.l    (AbsExecBase).w,a6
  237.     jsr    _LVORawDoFmt(a6)
  238.     move.l    (a7)+,a0
  239.     bra    write
  240.  
  241. .setin:    move.b    d0,(a3)+
  242.     rts
  243.  
  244.  
  245. ;----------------------------
  246. ;
  247. ; write text to stdout
  248. ;
  249. ; a0: text to be written
  250. ;
  251. write:    movem.l    d0-a6,-(sp)
  252.  
  253. .smartwriteloop:
  254.     tst.b    (a0)
  255.     beq.s    .allwritten
  256.     move.l    a0,a1
  257.  
  258. .loop:    tst.b    (a1)
  259.     beq.s    .nowprint
  260.     cmp.b    #10,(a1)+            ;LineFeed
  261.     bne.s    .loop
  262.  
  263. .nowprint:
  264.     move.l    a0,d2
  265.     move.l    a1,-(sp)
  266.     move.l    a1,d3
  267.     sub.l    d2,d3
  268.     move.l    outputhd(pc),d1
  269.     move.l    DosBase(pc),a6
  270.     jsr    -48(a6)
  271.     move.l    (sp)+,a0
  272.     bra.s    .smartwriteloop
  273.  
  274. .allwritten:
  275.     movem.l    (sp)+,d0-a6
  276.     rts
  277.  
  278.  
  279. ;--------------------------------------------------------------------
  280. ;
  281. ; simple command line parser
  282. ;
  283. ; <-h, -f, -c>
  284. ;
  285. getcommandline:
  286.     clr.b    flag(a5)
  287.     move.l    cmdline(pc),a0
  288.     move.l    cmdsize(pc),d0
  289. gcloop:    move.b    (a0)+,d1
  290.     cmp.b    #10,d1
  291.     beq.s    ender
  292.     cmp.b    #" ",d1
  293.     bne.s    para
  294.     dbra    d0,gcloop
  295. ender:    moveq    #0,d0
  296.     rts
  297.  
  298.  
  299. para:    cmp.b    #"-",d1                ;parameter?
  300.     bne.s    usage
  301. next:    move.b    (a0)+,d1
  302.     cmp.b    #"h",d1                ;hex format
  303.     bne.s    .f
  304.     pea    hexer(pc)
  305.     move.l    (a7)+,typ(a5)
  306.     bra.s    ender
  307. .f:    moveq    #-1,d0
  308.     cmp.b    #"f",d1                ;fastmem
  309.     beq.s    .flush
  310. .c:    moveq    #1,d0
  311.     cmp.b    #"c",d1                ;chipmem
  312.     bne.s    usage
  313. .set:    move.b    d0,flag(a5)
  314.     bra.s    ender
  315.  
  316. .flush:    cmp.b    #"l",(a0)
  317.     bne.s    .set
  318.     moveq    #2,d0
  319.     addq.l    #1,a0
  320.     cmp.b    #"u",(a0)+
  321.     bne.s    usage
  322.     cmp.b    #"s",(a0)+
  323.     bne.s    usage
  324.     cmp.b    #"h",(a0)+
  325.     beq.s    .set
  326.  
  327. usage:    lea    usagetxt(pc),a0            ;print usage
  328.     bsr    write
  329. badout:    moveq    #-1,d0
  330.     rts
  331.  
  332.  
  333.  
  334.  
  335. ;-------------------------------------------------------------------------------
  336. DosName:    dc.b    "dos.library",0
  337. memchip:    dc.b    "chip ",0
  338. memfast:    dc.b    "fast ",0
  339. memtot:        dc.b    "total",0
  340. menline:    dc.b    $9b,"1mAvail2 v",version,$9b,"0m by Daniel Weber",$a
  341.         dc.b    "Type  Available    In-Use   Largest   Maximum",$a,0
  342. string:        dc.b    "%-5s  %8ld  %8ld  %8ld  %8ld",$a,0
  343. hexer:        dc.b    "%-5s $%08lx $%08lx $%08lx $%08lx",10,0
  344.  
  345. usagetxt:    dc.b    $9b,"1mAvail2",$9b,"0m by Daniel Weber",$a
  346.         dc.b    "Usage: Avail2 (-[h|c|f|flush])",$a
  347.         dc.b    "       -h     : output in hex format",$a
  348.         dc.b    "       -c     : report chipmem only",$a
  349.         dc.b    "       -f     : report fastmem only",$a
  350.         dc.b    "       -flush : flush libraries first",$a,0
  351.         even
  352.  
  353. typ:        dc.l    string
  354.  
  355. ;-------------------------------------------------------------------------------
  356.  
  357. DosBase:    dx.l    1
  358. outputhd:    dx.l    1
  359. cmdline:    dx.l    1
  360. cmdsize:    dx.l    1
  361. flag:        dx.b    1
  362.         aligndx.w
  363.  
  364. rawlist:    dx.l    1        ;\ must be kept together!
  365. memarray:    dx.l    5        ;/
  366. workspace:    dx.l    6,0
  367. workmem:    dx.b    80,0
  368.  
  369. ;-------------------------------------------------------------------------------
  370.     end
  371.